/*
 * @FilePath: City.js
 * @Author: 杜芬
 * @Date: 2024-04-30 23:08:29
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2024-05-12 19:48:07
 * Copyright: 2024 xxxTech CO.,LTD. All Rights Reserved.
 * @Descripttion: 城市类页面
 */


// 城市类
import {  BaseModel } from './BaseModel';
import * as THREE from 'three';
import { EdgesLine } from '../effect/EdgesLine.js';
// 修改城市模型的着色器的颜色
import { modifyCityDefaultMaterial } from '../shader/modifyCityMaterial.js';
// 水面效果
import {  CityWater } from '../effect/CityWater.js';
// 计算物体大小的函数
import { getBoxCenter } from '../utils/getBoxCenter';
//火灾标记
import { Fire } from '../effect/Fire'; 
// 火灾影响范围
import { FireBall } from '../effect/FireBall';
// 建筑信息
import { BuildInfo } from '../dom/BuildInfo';
// 动效管理类
import { EffectManager } from '../utils/EffectManager';
// 单击事件管理类
import { ClickHandler } from '../utils/ClickHandler';
// 数据类
import { DataManager } from '../utils/DataManager';


export class City extends BaseModel{
  init() {
    this.scene.add(this.model)

    this.buildNameObj = { // 模型名字和建筑显示名字对应关系
      '01-shanghaizhongxindasha': '上海中心大厦',
      "02-huanqiujinrongzhongxin": "环球金融中心",
      "03-jinmaodasha": "金茂大厦",
      "04-dongfangmingzhu": "东方明珠",
    }


    this.initEffect()
    // this.initFire('01-shanghaizhongxindasha')
    this.bindClick()
    
  }

  // 初始化城市效果
  initEffect() {
    // 中心建筑材质
    const centerMaterial = new THREE.MeshBasicMaterial({
      color: 0xA8CDED,
      transparent:true
    })
    //  外围城市建筑材质
    const periphery = new THREE.MeshBasicMaterial({
      color: 0xA8CDED,
      transparent:true
    })
    this.model.traverse(model => {
      if(model.name === 'Text') {
        // 隐藏城市建筑名称
        model.visible = false
        return
      }
      // 排除不是地面与河流 的时候
      if(model.name !== 'Shanghai-09-Floor' && model.name !== 'Shanghai-08-River') {
        //修改城市模型的材质
        if (model.name == 'Shanghai-02' || model.name == 'Shanghai-03' || model.name == 'Shanghai-04' || model.name == 'Shanghai-05' || model.name == 'Shanghai-06' || model.name == 'Shanghai-07') {
          // 周围建筑
          model.material = periphery
          new EdgesLine(this.scene,model, new THREE.Color('#666666'))
          // 对物体追加混合的着色器代码（渐变色白膜效果）
          modifyCityDefaultMaterial(model, false)
        } else {
          // 中心建筑
          model.material = centerMaterial
          new EdgesLine(this.scene,model, new THREE.Color('#00ffff'))
          modifyCityDefaultMaterial(model, true)

        }

      }
    //  //   针对水物体单独处理
    //   if (model.name === 'Shanghai-08-River') {
    //     // 把原本水物体隐藏
    //     model.visible = false
    //     // 创建更加真实的水面效果物体
    //   const theWater =  new CityWater(model, this.scene)
    //     // 把水波纹物体传入到动效管理类当中
    //    EffectManager.getInstance().addObj(theWater)
    //   }
   
      // // 针对水物体单独处理
      // if (model.name === 'Shanghai-08-River') {
      //   // 把原本水物体隐藏
      //     model.visible = false
      //     // 创建更加真实的水面效果物体
      //     const theWater = new CityWater(model, this.scene)
      //     // 把水波纹物体传入到动效管理类当中
      //     EffectManager.getInstance().addObj(theWater)
      // }
    })
  }

  // 创建火灾标记
  // 
  initFire(buildName) {
    const build = this.model.getObjectByName(buildName)
    const { center, size } = getBoxCenter(build)
    const fire = new Fire(this.scene,center, size)
    const ball = new FireBall(this.scene,center)

    // 注册动效管理
   
    // 注册动效管理
     EffectManager.getInstance().addObj(ball)

    //  过来10秒之后清除标记
     setTimeout(() => {
       fire.clear( )
       ball.clear()
      //  移除动效
      EffectManager.getInstance().remobObj(ball)
     },15000)

   
  }

// 中心 4 个建筑绑定点击事件
bindClick() {
  Object.keys(this.buildNameObj).forEach(key => {
    const build = this.model.getObjectByName(key)
    ClickHandler.getInstance().addMesh(build, (object) => {
      // object: 3d 物体
      const { center } = getBoxCenter(object)
      new BuildInfo(this.scene, center, this.dataObj.buildingsIntroduce[object.name]) // 本地环境
      // new BuildInfo(this.scene, center, { // 假数据
      //         "squareMeters": "500",
      //         // "name": "上海中心大厦",
      //         "name": this.buildNameObj[object.name],
      //         "officesRemain": "500",
      //         "accommodate": "500",
      //         "parkingRemain": "88",
      //       //   "cameraPosition": {
      //       //     "x": "-27.60404773326758",
      //       //     "y": "77.6723594934777",
      //       //     "z": "190.86129619259177"
      //       // }
      //   })
    })
  })
}


}